import { ElNotification } from 'element-plus'

/**
 * @description 接收数据流生成 blob，创建链接，下载文件
 * @param {Function} api 导出表格的api方法 (必传)
 * @param {String} tempName 导出的文件名 (必传)
 * @param {Boolean} isNotify 是否有导出消息提示 (默认为 true)
 * @param {String} fileType 导出的文件格式 (默认为.xlsx)
 * */
export const useAsyncDownload = async (
  api: () => Promise<any>,
  tempName: string,
  fileType: string = '',
  isNotify: boolean = false
) => {
  // eslint-disable-next-line no-async-promise-executor
  return new Promise(async (resolve, reject) => {
    isNotify &&
      ElNotification({
        title: '温馨提示',
        message: '如果数据庞大会导致下载缓慢，请您耐心等待！',
        type: 'info',
        duration: 3000
      })

    try {
      const res = await api()
      const blob = new Blob([res], { type: 'application/x-msdownload' })
      // 兼容 edge 不支持 createObjectURL 方法
      if ('msSaveOrOpenBlob' in navigator) return window.navigator.msSaveOrOpenBlob(blob, tempName + fileType)
      const blobUrl = window.URL.createObjectURL(blob)
      const exportFile = document.createElement('a')
      exportFile.style.display = 'none'
      exportFile.download = `${tempName}${fileType}`
      exportFile.href = blobUrl
      document.body.appendChild(exportFile)
      exportFile.click()
      // 去除下载对 url 的影响
      document.body.removeChild(exportFile)
      window.URL.revokeObjectURL(blobUrl)
      resolve(true)
    } catch (err) {
      reject(err)
      throw err
    }
  })
}
